package cn.tedu._04mybatis.mapper;

import cn.tedu._04mybatis.pojo.entity.WeiBo;
import cn.tedu._04mybatis.pojo.vo.*;
import org.apache.ibatis.annotations.*;

import java.util.ArrayList;
import java.util.List;
import java.util.Set;

/**
 * 增删改   一般都是用int接收  表示表受到的影响行数
 * 查  一般是使用set集合   获取到的数据
 */
@Mapper
public interface WeiBoMapper {

    // 插入数据
/*    @Insert("INSERT INTO weibo(content,created,user_id) VALUES " +
            "(#{content},#{created},#{userId})")*/

    int insertWeiBo(WeiBo weiBo);


    // 删除数据
//    @Delete("DELETE FROM weibo WHERE id=#{id}")
    int deleteWeiBo(long id);

    // 修改数据
//    @Update("UPDATE weibo SET content=#{content},created=#{created},user_id = #{userId} WHERE id=#{id}")
    // 这里不建议使用非对象映射形式去传递参数
    // 1、当参数添加或者修改了参数名称，那么就会出现很多问题，
    // 2、如果使用了非对象形式去传递参数，会遇到 当有多个参数时，MyBatis不会自动使用参数名作为占位符的名称。
    //实际上，MyBatis会将参数按顺序命名为param1, param2等，或者使用它们的参数索引0, 1等。
    // int updateWeiBo(String content, Date created, long userId, long id);
    int updateWeiBo(WeiBo weiBo);

    /*
    4、单条数据全字段穿：查询指定微博所有字段的数据
    SELECT id,content,created,user_id FROM weibo WHERE id=#{id}
     */

    // 对于单条数据，可以使用实体类进行接收
//    @Select("SELECT id,content,created,user_id userId FROM weibo WHERE id=#{id}")
    WeiBo selectWeiBoById(long id);

    // 多条数据全字段来自同一张表，可以使用set集合进行接收
//    @Select("SELECT id,content,created,user_id userId FROM weibo WHERE user_id = #{userId}")
    List<WeiBo> selectWeiBoByUserId(long userId);

    // 单条数据分字段查询，查询指定的微博内容和发布时间
//    @Select("SELECT content,created FROM weibo WHERE id=#{id}")
    WeiBoVO1 selectWeiBoContentAndCreatedById(long id);

    // 查询指定用户发的所有微博的内容和发布时间，用户昵称
    /*@Select("SELECT u.nickname,w.content,w.created FROM user u " +
            "JOIN weibo w ON w.user_id = u.id WHERE u.id = #{userId}")*/
    List<WeiBoVO2> selectContentCreatedWeiBo(long userId);

    /*
    动态修改指定微博信息
     */
    int dynamicUpdateWeiBo(WeiBo weiBo);

    /*
    动态删除：数组形式删除
     */
    int dynamicDeleteWeiBoByArray(Long[] ids);

    /*
    动态删除：集合形式删除
     */
    int dynamicDeleteWeiBoByList(ArrayList<Long> ids);

    /*
    统计数量：统计微博表中的数据条数
    SELECT COUNT(*) FROM weibo
     */
    int selectCount();

    /*
    ResultMap单表：根据微博id查询该条微薄的id content userName created
     * ResultMap单表: 根据微博id查询该条微博的 id,content,user_id 字段的数据
     * SELECT id,content,user_id FORM weibo WHERE id=#{id}

     */
    ResultMapVO1 selectMap1(Long id);

    /*
    ResultMap多表：指定用户发布发微博信息
     */

    ResultMapVO2 selectMap2(Long userId);

    /*
    ResultMap多表练习：
    获取指定微博的所有评论信息，要求显示：微博id，微博内容，评论的结合List<comment>
     */

    ResultMapVO3 selectMap3(Long id);

    /*
    ResultMap多表练习：
    获取指定微博的信息，要求显示：微博id，微博内容，评论id,评论内容，评论时间
     */
    ResultMapVO4 selectMap4(Long id);

}
